Skip to main content

Getting Started

Creating a New Widget

You can scaffold a mobile widget in two ways:

ApproachCommandBest for
Offline starternx generate @cdx-extensions/widget-template-mobile:widgetBlank React Native library with no catalog
Catalog templatesnx run generate-mobile-widgetDI-backed starters from the extension template catalog

Both create a correctly structured React Native library wired for @cdx-extensions/di-sdk (PlatformSDK), built with tsup, and aligned with the CDX mobile patterns used in the reference implementations.

For catalog-driven generation (category picker, npm template overlays), see Extension Template Catalog. Quick reference:

Bash
nx run generate-mobile-widget                # interactive: widget only
nx run generate-mobile-extensions # interactive: type → category → template → fiId → name
nx run generate-mobile-widget -- --template=investment-portfolio --fiId=0123 --name=acme-portfolio
tip

Looking for a full-screen bottom-tab or More-menu experience instead? See Features — Getting Started.

The Offline Starter Template

Use the offline starter when you want a blank scaffold without the catalog. The package @cdx-extensions/widget-template-mobile exposes a widget generator for embedded home-screen components.

Prerequisites

Before you run the generator, complete the prerequisites and environment setup described in the CDX Extensibility Apps README.

When to Use a Widget

GeneratorUse whenExample
widgetYou are building a component the host mobile banking app embeds in the existing home screen.Sample widget running in the mobile sandbox
Sample Widget — embedded component on the home screen

Command

nx generate @cdx-extensions/widget-template-mobile:widget --fiId=<fi-id> --name=<name>
OptionRequiredDescription
--fiIdYesYour FI Id. Used as the package scope — the generated package name is @<fiId>-extensions/<name>
--nameYesName of the widget (e.g. account-summary). Used as the Nx project name and folder name

Example

nx generate @cdx-extensions/widget-template-mobile:widget --fiId=0000 --name=my-widget

What Gets Created

Scaffolded under widgets/mobile/<name>/ by default:

widgets/mobile/my-widget/
├── src/
│ ├── my-widget.tsx ← widget component — start here
│ ├── index.ts ← named + default exports
│ └── types/
│ └── branding.ts ← MobileBrandingTheme types and resolveColors helper
├── package.json
├── project.json
├── tsconfig.json
└── README.md
info

The widget starter template is minimal. Add API calls, navigation, or any SDK capability as your project requires — see the investment-portfolio reference implementation for an example that uses getHttpClient().

After You Generate

The generator registers your project in the sandbox automatically. From the repository root:

npm install
npx nx start mobile-sandbox

Press i for the iOS Simulator, a for Android Emulator, or scan the QR code with Expo Go on a physical device. The sandbox provides the mock platform (user context, branding, HTTP client) so your widget can run without the production host app.

For how widgets appear inside the banking-style home layout (scroll, chrome, and tabs), see Mobile Playground for more.

What You Can Edit

File / FolderCan you edit?Notes
src/Yes, freelyAll your UI and business logic goes here
package.jsonPartiallyChange name, version, peerDependencies. Keep the build scripts and tsup config as-is
project.jsonPartiallyOnly change name, outputs, and cwd to match your project folder
tsconfig*.jsonNoRequired TypeScript config

Common Mistakes to Avoid

MistakeWhy It Breaks
Using fetch() or Axios directly instead of sdk.getHttpClient()Bypasses platform auth and security in production
Importing from @cdx-extensions/di-sdk-mobile in widget codeOnly the host app initialises the platform — widgets import from @cdx-extensions/di-sdk only
Adding peer or runtime dependencies outside the versions listed in the CDX Extensibility Apps READMEVersion conflicts with the host mobile banking app at runtime
Forgetting to export from src/index.tsThe sandbox (or host app) cannot import your component
Changing the tsup build scripts in package.jsonBreaks the CJS/ESM dual output required for Metro and production bundling

Next Steps

Mobile platform guides: